#include<iostream>
#include<cmath>
using namespace std;
const int maxn=100;
const float maxfloat=10000000.0;
float a[maxn],b[maxn];
int partition(int l,int r,float base)
{
    int i=l-1,j=r+1;
    while(1)
    {
        while(a[++i]<base&&i<r);
        while(a[--j]>base);
        if(i>=j) break;
        swap(a[i],a[j]);
    }
    return j;
}
void bubblesort(int l,int r)
{
    for(int i=l;i<r;i++)
    {
        for(int j=l;j<=r-(i-l+1);j++)
        {
            if(a[j]>a[j+1])
            swap(a[j],a[j+1]);
        }
    }
}
float select(int l,int r,int rank)
{
    if(r-l<5)
    {
        bubblesort(l,r);
        return a[l+rank-1];
    }
    for(int i=0;i<=(r-l-4)/5;i++)
    {
        int ll=l+i*5,rr=ll+4;
        bubblesort(ll,rr);
        swap(a[l+i],a[ll+2]);
    }
    float x=select(l,l+(r-l-4)/5,(r-l+6)/10);
    int i=partition(l,r,x),j=i-l+1;
    if(rank<=j) return select(l,i,rank);
    else return select(i+1,r,rank-j);
}
void print(int n)
{
    for(int i=1;i<=n;i++)
    cout<<a[i]<<" ";
}
int main()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    //测试线性时间选择算法
    // for(int i=1;i<=n;i++)
    // cout<<select(1,n,i)<<" ";
    // cout<<endl;
    // bubblesort(1,n);
    // print(n);
    int cnt=0;float midval,n4val;
    //根据不同情况选出中位数
    if(n%2) midval=select(1,n,(n+1)/2);
    else{
        float x=select(1,n,n/2);
        float y=select(1,n,n/2+1);
        midval=(x+y)/2.0;
    }
    cout<<"The median: "<<midval<<endl;
    for(int i=1;i<=n;i++)
    {
        b[i]=a[i];
        //计算于中位数距离
        a[i]=abs(a[i]-midval);
        if(a[i]==0) a[i]=maxfloat;
    }
    //n4val为距离集合中第n/4的距离(0除外)
    n4val=select(1,n,n/4);
    cout<<"The closest n/4 elements: ";
    for(int i=1;i<=n;i++)
    {
        //不用等号是防止有多个与中位数距离相同元素导致实际输出数目过多
        if(abs(b[i]-midval)<n4val&&b[i]!=midval)
        cout<<b[i]<<" ",cnt++;
    }
    for(int i=1;i<=n&&cnt<n/4;i++)
    {
        //特判距离等于n4val的点
        if(abs(b[i]-midval)==n4val)
        cout<<b[i]<<" ",cnt++;
    }
    cout<<endl;
}